S3のメタデータは使うな

2020年05月05日

CacheControl等のメタデータではなく、ここではユーザー定義メタデータを指す

やりたかったこと

  • S3に画像以外のデータ(ファイル名などのデータ)を持たせて、取得したい
  • 画像用テーブルを作る必要がなくなる

検証

  • 保存はうまくできる
$options = [
    'SourceFile'   => $file->getTempName(),
    'ContentType'  => $file->getType(),
    'CacheControl' => 'no-cache',
    'Metadata'     => [
        'Name' => 'hoge.png'
        'Width'    => $width,
        'Height'   => $height,
        'Type'     => $file->getRealType(),
        'Filesize' => $file->getSize(),
    ]
];
$s3Client->putObject($option);
  • 取得は...
$iterator = $this->s3Client->getPaginator('ListObjects', [
    'Bucket' => 'hogehoge',
]);

foreach ($iterator as $page) {
    if (empty($page['Contents'])) continue;
    foreach ($page['Contents'] as $object) {
        $findOptions = [
            'Bucket' => $this->config->s3->bucket,
                'Key'    => $object['Key'],
            ];
        // $metaData = $object['MetaData']; No Exist
        $header = $this->s3Client->headObject($findOptions);// Request every time
        $metaData = $header['MetaData'];
    }
}

考察

  • S3 API(SDK、CLI)では一括でメタデータを取ることはできない
  • もしlistObjectに5500以上のデータがあればS3のリクエスト制限にひっかかる(5500req/sec)

結論

  • DynamoDB等に保存する